package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	// 创建一个gin 引擎
	engine := gin.Default()
	// 注册路由表 restful 的接口
	engine.GET("/get", doGet)
	engine.POST("/post", doPost)
	engine.PUT("/put", doPut)
	engine.DELETE("/delete", doDelete)

	// 返回json的2中方式,需要看doJson
	engine.GET("/json", doJson)

	// 返回结构体 对象
	engine.GET("/struct", doStruct)

	// 设置启动端口，默认是8080 可以自定义修改
	engine.Run(":9000")
}

// 使用get 方式请求
func doGet(c *gin.Context) {
	c.JSON(
		http.StatusOK, gin.H{
			"name": "张三-get",
		})
}

// 使用post方式请求
func doPost(c *gin.Context) {
	c.JSON(
		http.StatusOK, gin.H{
			"name": "张三-post",
		})
}

// 使用put 方式请求
func doPut(c *gin.Context) {
	c.JSON(
		http.StatusOK, gin.H{
			"name": "张三-put",
		})
}

// 使用delete方式请求
func doDelete(c *gin.Context) {
	c.JSON(
		http.StatusOK, gin.H{
			"name": "张三-delete",
		})
}

// 返回json 格式的数据
func doJson(c *gin.Context) {
	// 1 返回json 内容的格式
	data1 := map[string]interface{}{
		"name":     "张三",
		"sex":      "男",
		"birthday": "2020-01-02",
	}
	// 2、返回json
	data2 := gin.H{
		"name":     "张三",
		"sex":      "男",
		"birthday": "2020-01-02",
	}
	// 以下哪种方式都是可以的，gin。H 自身也就是一个map 结构，但是只能选择其中一个
	fmt.Printf("%+v, %+v \n", data1, data2)
	// c.JSON(http.StatusOK,data1)
	c.JSON(http.StatusOK, data2)
}

// ReturnMeg 返回数据结构
type ReturnMeg struct {
	Name     string `json:"name"`
	Sex      string `json:"sex"`
	Birthday string `json:"birthday"`
}

// 返回结构体
func doStruct(c *gin.Context) {
	// 获取前端get 中的 header 中的参数
	get := c.GetHeader("id")
	fmt.Printf("接收到的数据= %v\n", get)
	// 返回数据的构造
	mes := ReturnMeg{
		"golang", "go", "2006-01-02",
	}
	c.JSON(http.StatusOK, mes)
}
